/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.agi.sistema;

import br.com.agi.fs.Diretorio;
import br.com.agi.gae.comandos.Comando;
import br.com.agi.gae.comandos.ComandoEmSessaoInvalida;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Map;

/**
 *
 * @author renato.grosz
 */
public class SessaoNoSistema implements ComandosDoServidor{
    private Servidor servidor;
    private Diretorio diretorioCorrente;
    private EstadoConectado estadoConectado;
    private EstadoSessao estadoCorrente;

    public SessaoNoSistema(Servidor servidor){
        this.servidor=servidor;
        this.diretorioCorrente=this.servidor.getSistemaGravacao();
        estadoConectado=new EstadoConectado();
        this.estadoCorrente=estadoConectado;
    }

    void comandar(String string) throws IOException {
        String[] comando;
        Comando com;
        com=estadoCorrente.getComando(string);
        comando=estadoCorrente.getComando();
        if(com==null){
            throw new FileNotFoundException("Comando nao existe : " + comando[0]);
        }
        com.setSistema(this);
        com.comandar(comando);
    }

    public Diretorio getDiretorioCorrente() {
        return(diretorioCorrente);
    }

    public void setDiretorioCorrente(Diretorio diretorio){
        this.diretorioCorrente=diretorio;
    }

    protected void setComandos(Map<String, Comando> comandos){
        this.estadoConectado.setComandos(comandos);
    }

    public void logout() {
        this.estadoCorrente=new EstadoDesconectado();
    }


    private class EstadoDesconectado implements EstadoSessao{
        private ComandoEmSessaoInvalida comando;
        public EstadoDesconectado(){
            comando=new ComandoEmSessaoInvalida();
        }

        public Comando getComando(String cmd) {
            return(comando);
        }

        public String[] getComando() {
            return(null);
        }



    }

    private class EstadoConectado  implements EstadoSessao{
        private Map<String,Comando> comandos;
        private String[] comando;
        public Comando getComando(String cmd) {
            Comando com;
            comando=cmd.split(" ");
            com=comandos.get(comando[0]);
            return(com);
        }

        public String[] getComando(){
            return(comando);
        }

        public void setComandos(Map<String,Comando> comandos){
            this.comandos=comandos;
        }
    }
}
